iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 7
1
Software Development

Kotlin for Android系列 第 7

Day 07. Kotlin 語言學習 - Nullable 安全性

  • 分享至 

  • xImage
  •  

  今日課程的概念在程式設計過程扮演非常重要的角色,有許多應用程式發生錯誤導致 crash,部分的主因與 Null 安全性有很大的關係,在 Kotlin 中宣告變數預設是無法指定 null 的,但在實務上進行程式設計時,有很多情境都需要用到空值的概念,這時可用 nullable 符號 ?,來進行宣告:

https://ithelp.ithome.com.tw/upload/images/20181021/20111944yPkWxABb2w.png

  將 null 變數直接列出來時,雖然在 console 看到的是 null 但它是實實在在的空值,不等於字串 "null"。

https://ithelp.ithome.com.tw/upload/images/20181021/20111944RFnOOcA2SI.png

  讀者不妨一邊開著線上昨日提到的 IDE 網站,一邊跟著圖片內容動手試試。


  一旦使用了 nullable 後,就必須格外小心處理該變數,通常 IDE 會幫你檢查潛在的陷阱,例如在處理字串長度時使用 .length,但空值是沒有長度的,因此編輯器會警告你不要做傻事!

https://ithelp.ithome.com.tw/upload/images/20181021/201119448IK9NKXRxh.png

  那該如何處理 nullable 呢?有一種是強迫性的威脅 IDE 說:我很確定最終使用這個變數時,它不會是 null,我 100% 保證,你不用替我擔心沒關係。這時就可在變數後加上 !! 兩個驚嘆號運算子,強制通過規則限制,同時你也要承擔萬一這個變數處理時仍是 null 就會導致程式崩潰的風險,一般來說並不建議隨意使用 !!

https://ithelp.ithome.com.tw/upload/images/20181021/20111944YxAv915fgl.png


  正確的處理方式有三種,各用法都有其適合的使用情境,第一種:應針對可為空值的變數進行特別判斷,以下圖解加入了函式一起示範,只要有使用 if 事先判斷值是否為 null,IDE 就會認可這種處理方式,不會顯示錯誤。

https://ithelp.ithome.com.tw/upload/images/20181021/201119443EpAHpSSNc.png

  當進行程式設計,你需要一個普通變數是來自另一個 Nullable 變數時,在 Kotlin 中 ?: 不是其他程式的三元運算子 (C# => (int1 == null) ? -1 : int1.length;),取代 ?: 的用法是用單行 if...else

https://ithelp.ithome.com.tw/upload/images/20181021/20111944pG4TdPnRhU.png


  第二種方法是使用 safe calls 運算子 (一個問號 ? 表示),在變數後加上 => nullableStr?.length,一般來說,.length 會傳回一般整數型態,加上了 ? 運算子後,會把整段回傳型態一起變成可為空值的整數型態,如下圖示範中,變數 a 承接的是正常型態的整數,所以若指定 null 值給 a 就會發生錯誤;變數 b 透過安全運算子變成 Int? 型態,之後也能繼續指定回 null。

https://ithelp.ithome.com.tw/upload/images/20181021/20111944JhHgrleVgg.png


  第三種方法採用 ?: 運算子,代表著若前面的變數是 null 時,就指定一個 ?: 後面的值給它,(在 C# 會是使用兩個問號 ??,反而 ?: 是另作它用,在上面的第一種方法有提到,作者表示頭痛),請看下圖說明,?: 其實就等於 if null...else 的寫法,可以想成是當空值時預設值的概念,注意這邊是用變數宣告當範例,並不代表只能用在變數宣告喔。

https://ithelp.ithome.com.tw/upload/images/20181021/20111944U6CvOkC0Qz.png


  今日的學習就到這邊,由於這些概念都非常重要,在應用開發時使用的頻率很高,希望大家都能實際試試看各運算元的使用方式,避免將來的設計產生瑕疵。最近的程式語言介紹章節重點會在圖片上,其實作者花在圖片的時間比文字還多,盡可能地列出互相比較,讓大家比較能意會,希望有幫助,我們明天見!


資料參考

Null Safety - Kotlin Programming Language
https://kotlinlang.org/docs/reference/null-safety.html


上一篇
Day 06. Kotlin 語言學習 - 變數運用
下一篇
Day 08. Kotlin 語言學習 - 函式、判斷式、集合
系列文
Kotlin for Android30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言